package com.esender.strategy.filter.impl;

import com.esender.common.enums.ExceptionEnums;
import com.esender.common.exception.StrategyException;
import com.esender.common.model.StandardSubmit;
import com.esender.strategy.client.BeaconCacheClient;
import com.esender.strategy.filter.StrategyFilter;
import com.esender.strategy.util.ErrorSendMsgUtil;
import com.esender.strategy.util.HutoolDFAUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;

@Service(value = "dirtyword")
@Slf4j
public class DirtyWordStrategyFilter implements StrategyFilter {
    @Autowired
    private BeaconCacheClient beaconCacheClient;
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Autowired
    private ErrorSendMsgUtil errorSendMsgUtil;

    /**
     * 这是基于hutool工具类实现得敏感词校验 推荐
     * @param standardSubmit
     */
    @Override
    public void strategy(StandardSubmit standardSubmit) {
        log.info("【策略模块-敏感词校验】   校验ing…………");
        // 获取短信内容
        String text = standardSubmit.getText();
        // 对短信内容进行分词，并且将分词结果存进redis set集合重
        List<String> dirtyWords = HutoolDFAUtil.getDirtyWord(text);
        // 根据返回得set结果，判断是否包含敏感词
        if (!CollectionUtils.isEmpty(dirtyWords)){
            //5、 如果有敏感词，抛出异常 / 其他操作。。
            log.info("【策略模块-敏感词校验】   短信内容包含敏感词信息， dirtyWords = {}",dirtyWords);
            // 还需要做其他处理
            // 封装错误信息
            standardSubmit.setErrorMsg(ExceptionEnums.SMS_DIRTY_WORD.getMsg() + "dirtyWords = " + dirtyWords.toString());
            errorSendMsgUtil.sendWriteLog(standardSubmit);

            // ================================发送状态报告的消息前，需要将report对象数据封装================================
            // 查询当前客户的isCallback
            errorSendMsgUtil.sendPushReport(standardSubmit);

            throw new StrategyException(ExceptionEnums.SMS_DIRTY_WORD);
        }
    }

//    /**
//     * 这是基于手写DFA算法实现的敏感词校验
//     * @param standardSubmit
//     */
//
//    @Override
//    public void strategy(StandardSubmit standardSubmit) {
//        log.info("【策略模块-敏感词校验】   校验ing…………");
//        // 获取短信内容
//        String text = standardSubmit.getText();
//        // 对短信内容进行分词，并且将分词结果存进redis set集合重
//        Set<String> dirtyWords = DFAUtil.getDirtyWord(text);
//        // 根据返回得set结果，判断是否包含敏感词
//        if (!CollectionUtils.isEmpty(dirtyWords)){
//            //5、 如果有敏感词，抛出异常 / 其他操作。。
//            log.info("【策略模块-敏感词校验】   短信内容包含敏感词信息， dirtyWords = {}",dirtyWords);
//            // 还需要做其他处理
//        }
//    }

    /**
     * 这是基于IK分词器实现的敏感词校验
     * @param standardSubmit
     */
//    @Override
//    public void strategy(StandardSubmit standardSubmit) {
//        log.info("【策略模块-敏感词校验】   校验ing…………");
//        // 获取短信内容
//        String text = standardSubmit.getText();
//        // 对短信内容进行分词，并且将分词结果存进redis set集合重
//        Set<String> contents = new HashSet<>();
//        StringReader reader = new StringReader(text);
//        IKSegmenter ikSegmenter = new IKSegmenter(reader,false);
//        Lexeme lexeme = null;
//        while (true){
//            try {
//                if ((lexeme = ikSegmenter.next()) == null) break;
//            } catch (IOException e) {
//                log.info("【策略模块-敏感词校验】   IK分词器在处理短信内容时，出现异常 e = {}" ,e.getMessage());
//            }
//            contents.add(lexeme.getLexemeText());
//        }
//        // 调用缓存模块得交集方法，拿到结果
//        Set<Object> dirtyWords = beaconCacheClient.sinterstr(UUID.randomUUID().toString(), CacheConstant.DIRTY_WORD, contents.toArray(new String[contents.size()]));
//        // 根据返回得set结果，判断是否包含敏感词
//        if (!CollectionUtils.isEmpty(dirtyWords)){
//            //5、 如果有敏感词，抛出异常 / 其他操作。。
//            log.info("【策略模块-敏感词校验】   短信内容包含敏感词信息， dirtyWords = {}",dirtyWords);
//            // 还需要做其他处理
//        }
//    }
}
